package com.hbnu.common.util;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 数据库工具类，负责加载配置、获取连接、关闭资源
 */

public class DBUtil {
    private static final String URL;
    private static final String USER;
    private static String PASSWORD;

    private static final Logger logger = LoggerFactory.getLogger(DBUtil.class);

    // 静态代码块：加载配置文件和驱动
    static {
        try (InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("config/jdbc.properties")) {
            if (is == null) {
                logger.error("未找到jdbc.properties配置文件，请确认文件在src/main/resources/config目录下");
                throw new RuntimeException("未找到jdbc.properties配置文件，请确认文件在src/main/resources/config目录下");
            }

            Properties properties = new Properties();
            properties.load(is);

            URL = properties.getProperty("url");
            USER = properties.getProperty("user");
            PASSWORD = properties.getProperty("password");

            if (URL == null || URL.trim().isEmpty()) {
                logger.error("未找到数据库连接地址，请确认jdbc.properties配置文件中的url属性");
                throw new RuntimeException("未找到数据库连接地址，请确认jdbc.properties配置文件中的url属性");
            }

            if (USER == null || USER.trim().isEmpty()) {
                logger.error("未找到数据库用户名，请确认jdbc.properties配置文件中的user属性");
                throw new RuntimeException("未找到数据库用户名，请确认jdbc.properties配置文件中的user属性");
            }

            // MySQL密码允许为空
            if (PASSWORD == null || PASSWORD.trim().isEmpty()) {
                PASSWORD = "";
            }

            // Class.forName(properties.getProperty("driver")); JDBC 4.0+ 后无需手动加载驱动（DriverManager会自动扫描并注册）
        } catch (Exception e) {
            logger.error("DBUtil初始化失败：{}", e.getMessage(), e);
            throw new RuntimeException("DBUtil初始化失败：" + e.getMessage(), e);
        }
    }

    /**
     * 获取数据库连接
     *
     * @return 数据库连接对象（非null，连接失败直接抛异常）
     * @throws SQLException 当连接获取失败时抛出（如URL错误、账号密码错误）
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }

    /**
     * 关闭数据库资源（ResultSet、PreparedStatement、Connection）
     *
     * @param rs 结果集
     * @param pstmt 预编译语句
     * @param conn 数据库连接
     */
    public static void close(ResultSet rs, PreparedStatement pstmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                logger.error("ResultSet rs关闭失败：{}", e.getMessage());
            }
        }

        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                logger.error("PreparedStatement pstmt关闭失败：{}", e.getMessage());
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                logger.error("Connection conn关闭失败：{}", e.getMessage());
            }
        }
    }
}
